/*
 * Filtr.java
 *
 * Created on 15. listopad 2006, 5:54
 *
 */

package cz.results.winter6.model;

import cz.results.winter6.utilities.Expression;
import java.text.ParseException;
import java.util.Hashtable;
import java.util.Iterator;


public class Filtr {
    
    /** nazev filtru - pouziti napr.: pri vyberu filtru comboboxem */
    private String nazev="";
    /** vyraz jehoz vysledkem po vyhodnoceni je true nebo false napr.: ((VK==\"DS\") || (VK==\"DM\")) && (kategorie==\"k1m\")
     * musi se dusledne ozavorkovat kazdy vyraz*/
    private String vyraz="1==1";
    /** trida pro vyhodnoceni matematickeho vyrazu, v tomto pouziti pro vyhodnoceni logickeho vyrazu */
    private Expression expression;
    
    public Filtr(String vyraz) {
        this.setVyraz(vyraz);
        initExpression();
    }
    
    public void initExpression(){
        try {
            expression = new Expression(vyraz);
        } catch (ParseException e) {
            System.out.println("Filtr: parseException...");               //!!!!!!!!!!!!!!!!!!!!!osetrit
        }
    }
    
    /** metoda vrati true jestlize startovni subjekt vyhovuje filtru, resp.: priznaky startovniho subjektu)
     *  @param startSubjekt startovni subjekt, jenz bude zkouman zda vyhovuje vyrazu
     *  @return vraci true, pokud startovni subjekt vyhovuje vyrazu */
    public boolean vyhovujeFiltru(StartSubjekt startSubjekt){
        Hashtable hashtable;
        
        hashtable = new Hashtable();
        
        for(Iterator i = startSubjekt.getPriznaky().keySet().iterator(); i.hasNext();){   // vytvori hashtable ze vsech priznaku startovniho subjektu
            String key = (String) i.next();
            Priznak priznak = (Priznak) startSubjekt.getPriznaky().get(key);
            hashtable.put(key,priznak.getHodnota());
        }
        
        return expression.isTrue(hashtable);               //samotne vyhodnoceni vyrazu pro startovni subjekt
    }
    
    /** filtruje list startovnich subjektu, vytvori novy list startovnich subjektu, jenz obsahuje vsechny startovni
     *  subjekty, ktere vyhovuji filtru
     *  @param inList vstuplni list stastovnich subjektu
     *  @return vraci list startovnich subjektu vyhovujicich filtru */
    public StartSubjektList filtruj(StartSubjektList inList){
        StartSubjektList outList = new StartSubjektList();
        
        for(Iterator i = inList.iterator(); i.hasNext();){                    //pro kazdej ss v listu
            StartSubjekt startSubjekt  = (StartSubjekt) i.next();
            
            if(vyhovujeFiltru(startSubjekt)) {
                outList.add(startSubjekt);
            }
        }
        return outList;
    }
    
    public String toString(){
        return getNazev();
    }
    
    public String getNazev() {
        return nazev;
    }
    
    public void setNazev(String nazev) {
        this.nazev = nazev;
    }

    public String getVyraz() {
        return vyraz;
    }

    public void setVyraz(String vyraz) {
        this.vyraz = vyraz;
        initExpression();
    }
    
}